package cn.tedu.executorservice;

import java.util.concurrent.*;

public class ExecutorServiceDemo2 {
    public static void main(String[] args) {
        /**
         * 特点:
         * 1. 没有核心线程，全部都是临时线程
         * 2. 临时线程的数量是Integer.MAX_VALUE，即2^31-1, 然而考虑到单台服务器的线程承载量远远小于这个数字，所以可以认为这个线程池可以处理无限多的请求
         * 3. 临时线程用完之后可以存活1分钟
         * 4. 工作队列是一个同步队列
         * 大池子小队列，适用于高并发的短任务场景, 例如: 即时通讯; 不适应于长任务场景
         */
        ExecutorService es = Executors.newCachedThreadPool();

        /**
         * 特点:
         * 1. 没有临时线程，全部都是核心线程
         * 2. 工作队列是阻塞式链式队列，容量是Integer.MAX_VALUE, 考虑到实际过程中不会往队列中存放21亿个任务, 所以可以认为这个线程池能够存储无限多的请求
         * 小池子大队列，适用于并发低的长任务场景，例如: 百度云盘下载; 不适用于高并发的短任务
         */
        ExecutorService es2 = Executors.newFixedThreadPool(5);

        // 将任务交给线程池处理, 将结果封装成了Future对象
        Future<String> f = es.submit(new CDemo());
        try {
            System.out.println(f.get());
        } catch (ExecutionException executionException) {
            executionException.printStackTrace();
        } catch (InterruptedException interruptedException) {
            interruptedException.printStackTrace();
        }
        es.shutdown();
    }
}

/**
 * 泛型表示返回值的类型
 */
class CDemo implements Callable<String> {
    @Override
    public String call() throws Exception {
        return "SUCCESS";
    }
}
